<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // 函数：
        // 函数的本质：就是一个工具
        // 函数的特点：复用性   封装性   调用性
        
        // 函数封装(提取形参，考虑返回值，参数说明)

        // 参数问题
        //    形参：函数声明的时候
        //    实参：函数调用的时候
        
        //    形参的本质：局部变量



        // 返回值问题
        //    return  函数的一个执行结果
        //    return  提前结束函数

        // 作用域 --- 生命周期
        //    全局变量   ---  在函数外面声明的变量和没有var的变量
        //    局部变量   ---  在函数内部声明的变量
        
        // 作用域链：在使用一个变量的时候，函数内部是否声明过，如果函数内部声明了，就优先使用自己的；如果自己没有，就找上一层函数，上一层函数如果也没有，就找外面的全局变量，如果全局变量也没有就直接报错  is not defined


        // 预编译
        //   1 提升var声明的变量
        //   2 提升具名函数
        //   3 注意的问题
        //     函数内部也有预编译
        //     当函数名和变量名重复的时候，会覆盖
        //     没有var的变量会提升为全局变量，但是有先后顺序(在这个变量出现之前使用都会报错)


        // 递归：函数自己调用自己  --- 传递与回归
        //    函数自己调用自己
        //    递归函数一定要有出口   --- 死递归   报错---超出最大堆栈大小(内存溢出)
        //    递归在开发中使用不是特别多


        // console.log(666) ;
        // function fn() {
        //     console.log(1) ;
        // }
        // console.log(2);
        // fn() ;
        // console.log(3);


        console.log(a) ;    // undefined
        var a = 1 ;
        console.log(b);     // 报错 is not defined
        b = 2 ;


    </script>
    
</body>
</html>